package cc.leap.web;

import cc.leap.constant.UserConstants;
import cc.leap.helper.LoginHelper;
import cc.leap.model.AjaxResult;
import cc.leap.model.domain.SysDept;
import cc.leap.service.SysDeptService;
import cc.leap.utils.StringUtils;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.extern.java.Log;
import org.apache.commons.lang3.ArrayUtils;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Delete;
import org.noear.solon.annotation.Get;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Post;
import org.noear.solon.annotation.Put;
import org.noear.solon.validation.annotation.Validated;

import java.util.List;

/**
 * SysDeptController
 *
 * @author leap
 * @date 2024/8/20
 */
@Controller
@Mapping("/system/dept")
public class SysDeptController {

    @Inject
    SysDeptService deptService;

    /**
     * 获取部门列表
     */
    @SaCheckPermission("system:dept:list")
    @Get
    @Mapping("/list")
    public AjaxResult list(SysDept dept) {
        List<SysDept> depts = deptService.selectDeptList(dept);
        return AjaxResult.success(depts);
    }

    /**
     * 新增部门
     */
    @SaCheckPermission("system:dept:add")
    @Post
    @Mapping
    public AjaxResult add(@Validated SysDept dept) {
        if (!deptService.checkDeptNameUnique(dept)) {
            return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败，部门名称已存在");
        }
        dept.setCreateBy(LoginHelper.getUsername());
        return AjaxResult.success(deptService.insertDept(dept));
    }

    /**
     * 修改部门
     */
    @SaCheckPermission("system:dept:edit")
    @Put
    @Mapping
    public AjaxResult edit(@Validated SysDept dept) {
        Long deptId = dept.getDeptId();
        if (!deptService.checkDeptNameUnique(dept)) {
            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败，部门名称已存在");
        } else if (dept.getParentId().equals(deptId)) {
            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败，上级部门不能是自己");
        }
        dept.setUpdateBy(LoginHelper.getUsername());
        return AjaxResult.success(deptService.updateDept(dept));
    }

    /**
     * 查询部门列表（排除节点）
     */
    @SaCheckPermission("system:dept:list")
    @Get
    @Mapping("/list/exclude/{deptId}")
    public AjaxResult excludeChild(Long deptId) {
        List<SysDept> depts = deptService.selectDeptList(new SysDept());
        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
        return AjaxResult.success(depts);
    }

    /**
     * 根据部门编号获取详细信息
     */
    @SaCheckPermission("system:dept:query")
    @Get
    @Mapping(value = "/{deptId}")
    public AjaxResult getInfo(Long deptId) {
        return AjaxResult.success(deptService.selectDeptById(deptId));
    }


    /**
     * 删除部门
     */
    @SaCheckPermission("system:dept:remove")
    @Delete
    @Mapping("/{deptId}")
    public AjaxResult remove(Long deptId) {
        if (deptService.hasChildByDeptId(deptId)) {
            return AjaxResult.warn("存在下级部门,不允许删除");
        }
        if (deptService.checkDeptExistUser(deptId)) {
            return AjaxResult.warn("部门存在用户,不允许删除");
        }
        return AjaxResult.success(deptService.deleteDeptById(deptId));
    }
}
